﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MS.InformationManagement.Core.Support;
using MS.InformationManagement.Core.TransactionsResponse;
using MS.InformationManagement.DAL.DocumentCenter;
using MS.InformationManagement.Support;
using MS.InformationManagement.Support.Constants;
using Microsoft.SharePoint;
using MS.InformationManagement.DAL.DTOs;

namespace MS.InformationManagement.BLL.DocumentPrinterCommands
{
    public class GetNonPrintedDocumentsLibraryCommand : ICommandWithResponse
    {
        #region fields

        string _libraryName;
        int _pageIndex;
        int _pageSize;
        PrinterDocumentsResponse _response;

        #endregion

        #region Constructors

        public GetNonPrintedDocumentsLibraryCommand(string libraryName, int pageIndex, int pageSize)
        {
            _pageIndex = pageIndex;
            _pageSize = pageSize;
            _libraryName = libraryName;
        }

        #endregion

        public ITransactionResponse Execute()
        {
            _response = new PrinterDocumentsResponse();
            int startingIndex = _pageIndex * _pageSize;

            using (var ctx = new DCDocumentCenterDataContext(SPContext.Current.Web.Url))
            {

                var documents = (from radicado in ctx.GetList<RadicadoBaseSalida>(_libraryName)
                                              where (radicado.TipoRadicado == GlobalConstants.METADATA_TERM_TIPO_RADICADO_SALIDA &&
                                                     !radicado.FechaDeImpresión.HasValue) ||
                                                    (radicado.CopiasEntregadas.HasValue && !radicado.CopiasEntregadas.Value)
                                              select new DocumentToPrint() 
                                              { 
                                                 Asunto = radicado.Asunto,
                                                 Created = radicado.Created,
                                                 Devuelto = radicado.Devuelto,
                                                 Enviado = radicado.Enviado,
                                                 FechaRespuesta = radicado.FechaRespuesta,
                                                 Id = radicado.Id,
                                                 Impreso = radicado.Impreso,
                                                 Incluido = radicado.Incluido,
                                                 NoRadicado = radicado.NoRadicado,
                                                 RemitenteDestinatario = radicado.RemitenteDestinatario,
                                                 TipoDocumento = radicado.TipoDocumento,
                                                 Type = radicado != null ? radicado.Tipo.Label : string.Empty,
                                                 Path = radicado.Path + "/" + radicado.NoRadicado
                                              }).ToList();

                _response.DocumentsToPrint = new List<DocumentToPrint>();
                foreach (var document in documents)
                {
                    _response.DocumentsToPrint.Add(document);
                    _response.DocumentsToPrint.AddRange(CopiesHelper.GetNonPrintedDocumentCopies(document.Path, _libraryName, document.Asunto, document.Id.ToString(), document.NoRadicado));
                }

                _response.TotalRecords = _response.DocumentsToPrint.Count();
                _response.DocumentsToPrint = _response.DocumentsToPrint.Skip(startingIndex).Take(_pageSize).ToList();
            }

            return _response; 
        }

        public void Undo()
        {
            //Not necessary
        }

    }
}
